using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DProximity
{
    /// <summary>
    /// <para>Inside 3D</para>
    /// <para>Determines if 3D features from an input feature class are contained inside a closed multipatch, and writes an output table recording the features that are partially or fully inside the multipatch.</para>
    /// <para>确定输入要素类中的 3D 要素是否包含在闭合的多面体中，并写入记录部分或全部位于多面体内的要素的输出表。</para>
    /// </summary>    
    [DisplayName("Inside 3D")]
    public class Inside3D : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Inside3D()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_target_feature_class">
        /// <para>Input Features</para>
        /// <para>The input multipatch or 3D point, line, or polygon feature class.</para>
        /// <para>输入多面体或 3D 点、线或面要素类。</para>
        /// </param>
        /// <param name="_in_container_feature_class">
        /// <para>Input Multipatch Features</para>
        /// <para>The closed multipatch features that will be used as the containers for the input features.</para>
        /// <para>将用作输入要素容器的封闭多面体要素。</para>
        /// </param>
        /// <param name="_out_table">
        /// <para>Output Table</para>
        /// <para>The output table providing a list of 3D Input Features that are inside or partially inside the Input Multipatch Features which are closed. The output table contains an OBJECTID (object ID), Target_ID, and Status field. The Status field will state if the input feature (Target_ID) is inside or partially inside a multipatch.</para>
        /// <para>输出表提供位于闭合的输入多面体要素内部或部分内部的 3D 输入要素列表。输出表包含 OBJECTID（对象 ID）、Target_ID 和 Status 字段。状态字段将说明输入要素 （Target_ID） 是在多面体内部还是部分在多面体内。</para>
        /// </param>
        public Inside3D(object _in_target_feature_class, object _in_container_feature_class, object _out_table)
        {
            this._in_target_feature_class = _in_target_feature_class;
            this._in_container_feature_class = _in_container_feature_class;
            this._out_table = _out_table;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Inside 3D";

        public override string CallName => "3d.Inside3D";

        public override List<string> AcceptEnvironments => ["autoCommit", "configKeyword", "extent", "workspace"];

        public override object[] ParameterInfo => [_in_target_feature_class, _in_container_feature_class, _out_table, _complex_output.GetGPValue()];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input multipatch or 3D point, line, or polygon feature class.</para>
        /// <para>输入多面体或 3D 点、线或面要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_target_feature_class { get; set; }


        /// <summary>
        /// <para>Input Multipatch Features</para>
        /// <para>The closed multipatch features that will be used as the containers for the input features.</para>
        /// <para>将用作输入要素容器的封闭多面体要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Multipatch Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_container_feature_class { get; set; }


        /// <summary>
        /// <para>Output Table</para>
        /// <para>The output table providing a list of 3D Input Features that are inside or partially inside the Input Multipatch Features which are closed. The output table contains an OBJECTID (object ID), Target_ID, and Status field. The Status field will state if the input feature (Target_ID) is inside or partially inside a multipatch.</para>
        /// <para>输出表提供位于闭合的输入多面体要素内部或部分内部的 3D 输入要素列表。输出表包含 OBJECTID（对象 ID）、Target_ID 和 Status 字段。状态字段将说明输入要素 （Target_ID） 是在多面体内部还是部分在多面体内。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_table { get; set; }


        /// <summary>
        /// <para>Complex Output Table</para>
        /// <para><xdoc>
        ///   <para>Specifies if the output table will identify the relationship between the Input Features and the Input Multipatch Features through the creation of a Contain_ID field that identifies the multipatch feature that contains the input feature.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—The multipatch feature that contains an input feature will be identified.</bullet_item><para/>
        ///     <bullet_item>Unchecked—The multipatch feature that contains an input feature will not be identified. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输出表是否通过创建标识包含输入要素的多面体要素的Contain_ID字段来标识输入要素与输入多面体要素之间的关系。</para>
        ///   <bulletList>
        ///     <bullet_item>选中—将识别包含输入要素的多面体要素。</bullet_item><para/>
        ///     <bullet_item>未选中 - 将不识别包含输入要素的多面体要素。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Complex Output Table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _complex_output_value _complex_output { get; set; } = _complex_output_value._false;

        public enum _complex_output_value
        {
            /// <summary>
            /// <para>COMPLEX</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("COMPLEX")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>SIMPLE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("SIMPLE")]
            [GPEnumValue("false")]
            _false,

        }

        public Inside3D SetEnv(int? autoCommit = null, object configKeyword = null, object extent = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, workspace: workspace);
            return this;
        }

    }

}